Przykad 6.3. Realizacja algorytmu Dijkstry z kolejk priorytetow
#include "BinaryHeap.h"
#include "Graph.h"

/** W skierowanym grafie z wagami oblicz najkrtsz odlego (dist) do
 *  wierzchokw i dla wszystkich wierzchokw zapisz dowizania do
 *  poprzednikw (pred).
 */
void singleSourceShortest (Graph const &g, int s,                   /* we */
                           vector<int> &dist, vector<int> &pred) {  /* wy */
   // Zainicjuj tablice dist[] i pred[]. Zacznij od wierzchoka s,
   // ustawiajc dist[] na 0. Kolejka priorytetowa PQ zawiera wszystkie v z G
   const int n = g.numVertices();
   pred.assign(n, -1);
   dist.assign(n, numeric_limits<int>::max());
   dist[s] = 0;
   BinaryHeap pq(n);
   for (int u = 0; u < n; u++) { pq.insert(u, dist[u]); }
   // W nieustannie zmniejszajcym si zbiorze V-S znajd wierzchoek,
   // ktrego dist[] jest najmniejsza. Wylicz nowe potencjalne
   // cieki, aby uaktualni wszystkie najkrtsze cieki.
   while (!pq.isEmpty()) {
      int u = pq.smallest();

      // Dla ssiadw u sprawd, czy newLen (najlepsza cieka z s->u +
      // waga krawdzi u->v) jest lepsza ni najlepsza cieka z s->v.
      // Jeli tak, to uaktualnij dist[v] i odpowiednio skoryguj kopiec
      // binarny. Obliczaj w typie long, aby unikn bdu nadmiaru.
      for (VertexList::const_iterator ci = g.begin(u); ci != g.end(u); ++ci) {
         int v = ci->first;
         long newLen = dist[u];
         newLen += ci->second;
         if (newLen < dist[v]) {
            pq.decreaseKey(v, newLen);
            dist[v] = newLen;
            pred[v] = u;
         }
      }
   }
}
